package com.talent.jiwen.ui.widgets;

import android.content.Context;
import android.support.v7.widget.AppCompatEditText;
import android.text.InputFilter;
import android.text.Spanned;
import android.util.AttributeSet;

import com.talent.jiwen.util.MyToast;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NoEmojiEditText extends AppCompatEditText {
    // 输入表情前的光标位置
    private int cursorPos; // 输入表情前EditText中的文本
    private String inputAfterText; // 是否重置了EditText的内容
    private boolean resetText;
    private Context mContext;


    public NoEmojiEditText(Context context) {
        super(context);
        this.mContext = context;
        initEditText();
    }


    public NoEmojiEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.mContext = context;
        initEditText();
    }


    public NoEmojiEditText(Context context, AttributeSet attrs,
                           int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.mContext = context;
        initEditText();
    } // 初始化edittext 控件


    private void initEditText() {
//        InputFilter inputFilter=new InputFilter() {
//
//            Pattern pattern = Pattern.compile("[^a-zA-Z0-9\\u4E00-\\u9FA5_]");
//            @Override
//            public CharSequence filter(CharSequence charSequence, int i, int i1, Spanned spanned, int i2, int i3) {
//                Matcher matcher=  pattern.matcher(charSequence);
//                if(!matcher.find()){
//                    return null;
//                }else{
//                    MyToast.show(mContext , "只能输入汉字,英文，数字");
//                    return "";
//                }
//
//            }
//        };
        InputFilter inputFilter= new InputFilter() {
            Pattern emoji = Pattern.compile("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]",
                    Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);

            @Override
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                Matcher emojiMatcher = emoji.matcher(source);
                if (emojiMatcher.find()) {
                    MyToast.show(mContext, "不支持输入表情");
                    return "";
                }
                return null;
            }
        };

        setFilters(new InputFilter[]{inputFilter , new InputFilter.LengthFilter(1000)});

//        addTextChangedListener(new TextWatcher() {
//            @Override
//            public void beforeTextChanged(CharSequence s, int start,
//                                          int before, int count) {
//                if (!resetText) {
//                    cursorPos = getSelectionEnd(); // 这里用s.toString()而不直接用s是因为如果用s，
//// 那么，inputAfterText和s在内存中指向的是同一个地址，s改变了，
//// inputAfterText也就改变了，那么表情过滤就失败了
//                    inputAfterText = s.toString();
//                }
//
//            }
//
//
//            @Override
//            public void onTextChanged(CharSequence s, int start, int before,
//                                      int count) {
//                if (!resetText) {
//                    if (count >= 2) {// 表情符号的字符长度最小为2
//                        CharSequence input = s.subSequence(cursorPos, cursorPos
//                                + count);
//                        if (containsEmoji(input.toString())) {
//                            resetText = true;
//                            //暂不支持输入Emoji表情符号
//                            MyToast.show(mContext, "暂不支持输入表情符号");// 是表情符号就将文本还原为输入表情符号之前的内容
//                            setText(inputAfterText);
//                            CharSequence text = getText();
//                            if (text instanceof Spannable) {
//                                Spannable spanText = (Spannable) text;
//                                Selection.setSelection(spanText, text.length());
//                            }
//                        }
//                    }
//                } else {
//                    resetText = false;
//                }
//            }
//
//
//            @Override
//            public void afterTextChanged(Editable editable) {
//
//
//            }
//        });
    }

    /**
     * 检测是否有emoji表情
     *
     * @param source
     * @return
     */
    public static boolean containsEmoji(String source) {
        int len = source.length();
        for (int i = 0; i < len; i++) {
            char codePoint = source.charAt(i);
            if (!isEmojiCharacter(codePoint)) { // 如果不能匹配,则该字符是Emoji表情
                return true;
            }
        }
        return false;
    }


    /**
     * 判断是否是Emoji
     *
     * @param codePoint 比较的单个字符
     * @return
     */
    private static boolean isEmojiCharacter(char codePoint) {
        return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)
                || (codePoint == 0xD)
                || ((codePoint >= 0x20) && (codePoint <= 0xD7FF))
                || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
                || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
    }

}
